package com.woniu.teachmall.controller;

import com.woniu.teachmall.entity.Address;
import com.woniu.teachmall.service.AddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Slf4j
@RestController
@RequestMapping("/addresses")
public class AddressController {
    // 自动注入 AddressService 服务类，用于地址相关操作
    @Autowired
    private AddressService addressService;

    /**
     * 渲染新增地址页面
     * @param userId 用户ID
     * @return ModelAndView 返回渲染的页面及模型数据
     */
    @GetMapping("")
    public ModelAndView showAddForm(@RequestParam Integer userId) {
        ModelAndView mav = new ModelAndView("addAddress"); // 返回 addAddress.jsp 页面
        mav.addObject("userId", userId); // 将用户ID传递到页面
        return mav;
    }

    /**
     * 查询用户所有的地址
     * @param userId 用户ID
     * @return ModelAndView 返回渲染的页面及模型数据
     */
    @GetMapping("/user/{userId}")
    public ModelAndView getUserAddresses(@PathVariable Integer userId) {
        ModelAndView mav = new ModelAndView();

        // 获取指定用户的所有地址
        List<Address> addresses = addressService.getAddress(userId);

        // 将地址列表添加到 ModelAndView 对象
        mav.addObject("addressList", addresses);
        System.out.println(addresses);  // 打印地址列表，方便调试

        // 设置视图名称，返回 /WEB-INF/views/userAddresses.jsp 页面
        mav.setViewName("address");

        return mav;
    }

    /**
     * 查询单个地址的详情
     * @param addressId 地址ID
     * @return ResponseEntity 返回地址详情
     */
    @GetMapping("/{addressId}")
    public ResponseEntity<Address> getAddressById(@PathVariable Integer addressId) {
        // 返回指定ID的地址
        return ResponseEntity.ok(addressService.getAddressById(addressId));
    }

    /**
     * 创建新的地址
     * @param userId 用户ID
     * @param address 地址对象
     * @param redirectAttributes 用于在重定向时传递参数
     * @return String 重定向到用户地址列表
     */
    @PostMapping
    public String createAddress(@RequestParam Integer userId, @ModelAttribute Address address, RedirectAttributes redirectAttributes) {
        try {
            // 调用服务层方法创建新地址
            Address createdAddress = addressService.addAddress(userId, address);
            // 添加成功信息，重定向后显示
            redirectAttributes.addFlashAttribute("success", "地址添加成功！");
        } catch (RuntimeException e) {
            // 添加失败信息，重定向后显示
            redirectAttributes.addFlashAttribute("error", e.getMessage());
        }

        // 重定向到地址列表页面
        return "redirect:addresses/user/" + userId;
    }

    /**
     * 更新地址信息
     * @param addressId 地址ID
     * @param userId 用户ID
     * @param address 地址对象
     * @return ResponseEntity 返回204 No Content
     */
    @PutMapping("/{addressId}")
    public ResponseEntity<Void> updateAddress(@PathVariable Integer addressId, @RequestParam Integer userId, @RequestBody Address address) {
        address.setId(addressId);  // 设置地址ID
        // 调用服务层更新地址信息
        addressService.updateAddress(userId, address);
        // 返回204状态码，表示请求成功但无内容返回
        return ResponseEntity.noContent().build();
    }

    /**
     * 显示编辑地址表单页面
     * @param addressId 地址ID
     * @param userId 用户ID
     * @return ModelAndView 返回编辑地址页面及模型数据
     */
    @GetMapping("/{addressId}/edit")
    public ModelAndView showEditForm(@PathVariable Integer addressId, @RequestParam Integer userId) {
        ModelAndView mav = new ModelAndView("editAddress"); // 返回 editAddress.jsp 页面
        mav.addObject("address", addressService.getAddressById(addressId)); // 获取指定地址
        mav.addObject("userId", userId);  // 将用户ID传递到页面
        return mav;
    }

    /**
     * 删除指定的地址
     * @param addressId 地址ID
     * @return ResponseEntity 返回204 No Content
     */
    @DeleteMapping("/{addressId}")
    public ResponseEntity<Void> deleteAddress(@PathVariable Integer addressId) {
        // 调用服务层删除指定地址
        addressService.deleteAddress(addressId);
        // 返回204状态码，表示请求成功但无内容返回
        return ResponseEntity.noContent().build();
    }

    /**
     * 统一的异常处理方法
     * @param ex 捕获的异常
     * @return ResponseEntity 返回400错误码和错误信息
     */
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleAddressLimit(RuntimeException ex) {
        // 返回400状态码和异常信息
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(ex.getMessage());
    }
}
